/*
 * InputForm.java
 *
 * Created on 13-Aug-2009, 14:44:25
 * Copyright me
 */
package iffmyexp;

import com.icesoft.faces.async.render.SessionRenderer;
import com.icesoft.faces.component.ext.HtmlDataTable;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlOutputText;
import com.icesoft.faces.component.ext.HtmlPanelGrid;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import javax.faces.FacesException;
import tavernacon.DataResource;
import tavernacon.DataValue;
import tavernacon.RESTClient;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 */
public class WorkflowInterface extends AbstractPageBean {

    static Vector inputsVector;
    static String[] filesInDir;

    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">
    private int __placeholder;

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
   
    public static HtmlDataTable workflowsTable = new HtmlDataTable();

    public HtmlDataTable getWorkflowsTable() {
        return workflowsTable;
    }

    public void setWorkflowsTable(HtmlDataTable hdt) {
        this.workflowsTable = hdt;
    }
    public static HtmlDataTable inputsTable = new HtmlDataTable();

    public HtmlDataTable getInputsTable() {
        return inputsTable;
    }
    public HtmlOutputText workflowName = new HtmlOutputText();

    public HtmlOutputText getWorkflowName() {
        return workflowName;
    }

    public void setWorkflowName(HtmlOutputText hot) {
        this.workflowName = hot;
    }
    public static HtmlPanelGrid containerComponent;

    public HtmlPanelGrid getContainerComponent() {
        return containerComponent;
    }

    public void setContainerComponent(HtmlPanelGrid containerComponent) {
        this.containerComponent = containerComponent;
    }

    public void setinputsTable(HtmlDataTable hdt) {
        this.inputsTable = hdt;
    }

    public String descArrow = "/resources/css-images/column_sort_asc.gif";

    public String getDescArrow(){
        return descArrow;
    }

    public void setDescArrow(String str){
        descArrow = str;
    }

    public HtmlPanelGrid pg = new HtmlPanelGrid();

    public boolean workflowsVis = false;

    public boolean getWorkflowsVis() {
        return workflowsVis;
    }

    public void setWorkflowsVis(boolean wfb) {
        this.workflowsVis = wfb;
    }
    public boolean inputsVis = false;

    public boolean getInputsVis() {
        return inputsVis;
    }

    public void setInputsVis(boolean wfb) {
        this.inputsVis = wfb;
    }

    public boolean descVis = false;

    public boolean getDescVis() {
        return descVis;
    }

    public void setDescVis(boolean wfb) {
        this.descVis = wfb;
    }


    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public WorkflowInterface() {
        SessionRenderer.addCurrentSession("changeInterface");
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("MyExperimentSearch Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    public void destroy() {
    }

    public String toggleDesc(){

        descVis = !descVis;
        if(descVis){
            descArrow = "/resources/css-images/column_sort_desc.gif";
        }
        else{
            descArrow = "/resources/css-images/column_sort_asc.gif";
        }

        return null;
    }

    public String runWorkflow() {

        System.out.println("run");
        try {
            RESTClient tavernaRESTClient = new RESTClient();
            tavernaRESTClient.setBaseURL("http://localhost:9090/taverna-server-0.2.1/rest");

            Map<String, DataValue> ds = new HashMap<String, DataValue>();

            int noOfInputs = containerComponent.getChildren().size();

            for (int i = 0; i < noOfInputs; i = i + 6) {
                HtmlOutputText name = (HtmlOutputText) containerComponent.getChildren().get(i);//.getChildren().get(0);
                HtmlInputText in = (HtmlInputText) containerComponent.getChildren().get(i + 1);//.getChildren().get(1);
                //HtmlInputText hit = (HtmlInputText) obj;
                ds.put((String) name.getValue(), new DataValue((String) in.getValue()));

                String str = (String) name.getValue() + ", " + (String) in.getValue();
                System.out.println(str);
            }

            Long inputID = tavernaRESTClient.addData(new DataResource(ds));
            System.out.println("DataId :" + inputID);


            /*String workflowXML = IOUtils.toString(getClass().getResource("../test/pipeline.t2flow").openStream());
            Long workflowID = tavernaRESTClient.addWorkflow(workflowXML);
            System.out.println("WorkflowId :"+ workflowID);*/

            long wfid = 5;
            long startTime = System.currentTimeMillis();
            long duration = 0;
            Long jobID = tavernaRESTClient.addJob(wfid, inputID);
            System.out.println("JobId :" + jobID);

        } catch (Exception e) {
        }
        return null;
    }


    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }
}

